package com.itheima.exception;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 1.导入依赖 aspectj spring-context
 * 2.写通知类- 写通知方法
 * 3.定义切点
 * 4.把通知类变为切面类
 * 5.开启spring aop支持
 */
//切面注释
@Aspect
//被扫描
@Component
public class TimeAdvice {
    //切入点表达式(方法修饰符 方法返回值 包名.类名.方法名（参数类型）)
    @Pointcut("execution(public void com.itheima.dao.BookDao.save())")
    public void po(){}
    //通知
    @Around("TimeAdvice.po()")
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        //前置通知
        long startTime = System.currentTimeMillis();
        //万次执行
        for(int i = 0;i<10000;i++){
            jp.proceed();
        }
        //后置通知
        long endTime = System.currentTimeMillis();
        //endTime-startTime 执行时间ms
        String name = jp.getSignature().getName();//获取执行的方法名称
        String s = jp.getSignature().getDeclaringTypeName();//类路径名称
        System.out.println("执行方法："+s+"."+name+"万次执行效率："+(endTime-startTime));
        return null;
    }
}
